package 笔记.设计模式.代理模式.spring.jdk;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
import 笔记.设计模式.代理模式.spring.MyAspect;
import 笔记.设计模式.代理模式.spring.User;
import 笔记.设计模式.代理模式.spring.UserImpl;

import java.lang.reflect.Method;


/**
 * @author chenhailong
 * @ClassName: JDKProxy
 * @Description: JDK动态代理对象：被代理的目标对象必须要实现一个或者多个的接口，是Object类下面的子类
 * @date 2021/8/6 10:29
 * @Version 1.0
 */
public class JDKProxy implements InvocationHandler {

    private Object target; // 需要代理的目标对象
    final MyAspect myAspect = new MyAspect(); // 环绕通知

    public Object getJDKProxy(Object objects) {
        this.target = objects;
        // 创建目标对象
        return Proxy.newProxyInstance(objects.getClass().getClassLoader(),
                objects.getClass().getInterfaces(), this);
    }
    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {


        if (method.getName().equals("add")) {
            myAspect.myBefore();
        }
        Object invoke = method.invoke(target, args);

        myAspect.myAfter();
        return invoke;
    }



    // JDK动态代理测试
    public static void main(String[] args) {
        JDKProxy jdkProxy = new JDKProxy(); // 实例代理对象
        User user = (User) jdkProxy.getJDKProxy(new UserImpl()); // 创建目标对象
        user.add();
        user.del();
        /**
         * Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to 笔记.设计模式.代理模式.spring.jdk.UserImpl
         * 	at 笔记.设计模式.代理模式.spring.jdk.JDKProxy.main(JDKProxy.java:40)
         * 	第一次报错是因为创建目标对象需要用接口来接收
         */

    }

}
